package org.notes.multi;

import cn.hutool.core.util.RandomUtil;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Demo1 {
    /**
     * 以下是10个多线程训练题目，涵盖基础操作、同步控制及进阶场景：
     * 1. 交替打印奇偶数：创建两个线程，分别打印1-100的奇数和偶数，要求按顺序输出。
     * 2. 线程顺序执行：使用join()方法确保三个线程按T1→T2→T3的顺序执行。
     * 3. 模拟售票系统：三个窗口同时销售100张票，需处理线程安全问题，避免超卖。
     * 4. 生产者-消费者模型：使用阻塞队列或wait/notify实现生产者和消费者线程的协作。
     * 5. 死锁模拟与解决：编写代码故意制造死锁，再通过调整锁顺序或使用ReentrantLock解决。
     * 6. 线程池任务调度：使用ExecutorService提交任务，观察线程复用和任务队列机制。
     * 7. 共享资源竞争：多个线程同时修改一个计数器，通过synchronized或AtomicInteger保证线程安全。
     * 8. 读写锁应用：实现一个缓存系统，允许多线程读但单线程写，使用ReentrantReadWriteLock。
     * 9. 定时任务执行：使用ScheduledExecutorService实现每隔5秒执行一次的任务。
     * 10. 线程中断处理：创建一个长时间运行的线程，通过interrupt()方法安全终止线程。
     */

    public static void main(String[] args) throws InterruptedException {
        //1. 交替打印奇偶数：创建两个线程，分别打印1-100的奇数和偶数，要求按顺序输出。
        ExecutorService es = Executors.newFixedThreadPool(4);
        while (true) {
            int i = RandomUtil.randomInt(1000, 2000);
            System.err.println(i);
            if (i % 2 == 0) {
                es.submit(new OddTask(i));
            } else {
                es.submit(new EvenTask(i));
            }
            long l = RandomUtil.randomLong(1000, 2000);
            Thread.sleep(l);
        }
    }
}

//奇数线程
class OddTask implements Runnable {
    private int num;

    public OddTask(int num) {
        this.num = num;
    }

    @Override
    public void run() {
        System.out.println(this.getClass().getName() + "\t 奇数：" + num);
    }
}

//偶数线程
class EvenTask implements Runnable {
    private int num;

    public EvenTask(int num) {
        this.num = num;
    }

    @Override
    public void run() {
        System.out.println(this.getClass().getName() + "\t 偶数：" + num);
    }
}